/*
 * Util.h
 *
 *  Created on: 26/06/2012
 *      Author: natuchis
 */

#ifndef UTIL_H_
#define UTIL_H_

#include <string.h>
#include <iostream>
using namespace std;

class Util {

public:

	/** Este metodo se encarga de escribir en el archivo una variable. Recibe como parametros el fichero ya
	 *  abierto, la variable a escribir en el archivo del tipo y la posicion en donde escribir en el archivo.
	 *  OBLIGATORIAMENTE EL ARCHIVO UTILIZADO DEBE ESTAR ABIERTO PARA ESCRITURA
	 */
	template<class T>
	void serializar(FILE* & fichero, T variable, long int posicionArchivo = 0){
		fseek(fichero, posicionArchivo, SEEK_SET);
		fwrite(&variable,sizeof(T),1,fichero);
	}

	/** Idem serializar pero para cadenas */
	void serializarCadena(FILE* & fichero, void* cadena, long int tamanioCadena, long int posicionArchivo = 0){
		fseek(fichero, posicionArchivo, SEEK_SET);
		fwrite(cadena,tamanioCadena,1,fichero);
	}

	/**Este metodo se encarga de levantar de un archivo una cadena de bytes y para interpretar este stream
	 * como una variable de tipo T. Recibe como parametros el fichero ya abierto, la variable a "castear" y la
	 * posicion en el archivo desde la cual debe leer.
	 * OBLIGATORIAMENTE EL ARCHIVO UTILIZADO DEBE PODER LEERSE
	 */
	template<class T>
	void desSerializar(FILE* & fichero, T & variable, long int posicionArchivo = 0){
		fseek(fichero, posicionArchivo, SEEK_SET);
		fread(&variable,sizeof(T),1,fichero);
	}

	/** Idem desSerializar pero para cadenas */
	void desSerializarCadena(FILE* & fichero, void* cadena, long int longitudCadena, long int posicionArchivo = 0){
		fseek(fichero, posicionArchivo, SEEK_SET);
		fread(cadena,longitudCadena,1,fichero);
	}
};

#endif /* UTIL_H_ */
